"""
内置模块 random

random 模块主要用来生成随机数。使用前需要 import random 导入该模块，
"""

import random

''' 1. randint(a, b) 生成 [a , b] 之间的整数，包含边界 a 和 b，a 和 b 为整数 '''
print(random.randint(1, 10))  # 2

''' 2. random() 生成的时 [0, 1) 之间的浮点数，包含 0 不包含 1 '''
print(random.random())  # 0.8341704091457043

''' 3. randrange(起始, 结束, 步长) 生成[起始, 结束) 之间的整数，步长默认为 1 '''
print(random.randrange(1, 10))  # 6
print(random.randrange(1, 10, 2))  # 1 3 5 7 9
print(random.randrange(10, 1, -2))  # 10 8 6 4 2

''' 4. uniform(a, b) 生成 [a, b] 之间的浮点数 '''
print(random.uniform(1, 5.6))  # 1.1392305673053071

''' 5. sample(序列, 指定长度) 随机抽取序列（如列表、元组等）中指定长度的独立元素，返回列表 '''
lst = ['a', 'b', 'c', 'd', 'e', 'f']
print(random.sample(lst, 4))  # ['d', 'f', 'c', 'b']

''' 6. shuffle(列表) 随机将原列表的元素打乱（训练模型）'''
print('原列表的元素：', lst)  # ['a', 'b', 'c', 'd', 'e', 'f']
random.shuffle(lst)
print('打乱后的元素：', lst)  # ['c', 'd', 'b', 'e', 'f', 'a']

''' 7. seed(数字) 随机种子数，默认当前时间戳。如果设置种子数相同，随机生成的序列数就相同 '''
random.seed(1)
print('设置种子数为 1，生成随机数', random.random())  # 0.13436424411240122
random.seed(1)
print('种子数相同时 1，再次生成随机数', random.random())  # 0.13436424411240122

print("\n----------------------------")
''' 8. choices 随机从序列中抽取 k 次元素，返回列表，默认随机抽取的每个元素的概率是相同的 '''
# 格式：choices(序列, weights = 权重, cum_weights = 累加权重, k = 抽取次数)
# 1）从列表中随机抽取 1 个元素，每个元素的抽到的概率一样
print(random.choices(['a', 'b', 'c', 'd']))  # ['d']

# 2）从列表中随机抽取 3 个元素，每个元素的抽到的概率一样
print(random.choices(['a', 'b', 'c', 'd'], k=3))  # ['d', 'b', 'd']

# 3）从列表中随机抽取 6 个元素，每个元素的抽到的概率一样
print(random.choices(['a', 'b', 'c', 'd'], k=6))  # ['c', 'b', 'a', 'd', 'b', 'a']

# 4）从列表中随机抽取 5 个元素，设置每个元素的权重 weights = [1, 2, 3, 4]，
# 注意：默认自动累加，公式是 cum_weights = [sum(weights[:i + 1]) for i in range(len(weights))]
# 抽到 a 的概率 1/(1+2+3+4)=1/10，抽到 b 的概率 2/(1+2+3+4)=2/10，依次类推
print(random.choices(['a', 'b', 'c', 'd'], weights=[1, 2, 3, 4], k=5))  # ['d', 'b', 'd', 'c', 'c']

print("\n----------------------------")
''' 9.gauss 用于生成符合正态分布（高斯分布）的随机数。在统计和概率论中广泛应用。'''
# 格式：gauss(均值, 标准差)
# 案例：生成一个均值为 0，标准差为 1 的正态分布随机数
print(f'均值为 0，标准差为 1 的正态分布随机数 : {random.gauss(0, 1)}')  # 均值为 0，标准差为 1 的正态分布随机数 : -1.1502211898842019
# 案例：生成 5 个，均值为 5，标准差为 2 的正态分布随机数
print([random.gauss(5, 2) for _ in range(5)])
# [8.463866070700751, 3.8813903103519327, 6.6126138539222215, 5.660785020670923, 4.201387005007765]
# 理论上正态分布的随机数范围是从负无穷到正无穷，但实际上会集中在均值加减（1，2，3）倍标准差的范围内。
# 高斯分布的数有一个规则是：68（68% 在一个） 、95（95% 在两个） 、 99.7（99.7% 在三个）
